﻿using Sample_2MVC;
using Senparc.Weixin.MP;
using Senparc.Weixin.MP.Entities.Request;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Sample_1MVC.Controllers
{
    public class HomeController : Controller
    {
        //与微信公众账号后台的Token设置保持一致，区分大小写。
        private readonly string Token = "weixin";
        public ActionResult Index(string signature, string timestamp, string nonce, string echostr)
        {
            if (CheckSignature.Check(signature, timestamp, nonce, Token))
            {
                return Content(echostr); //返回随机字符串则表示验证通过

                //如果用下面的方法通不过微信认证，在微信公共号中保存服务器“配置项”的“URL”、“Token”时，会一直提示Token验证失败。
                //ViewBag.meg=echostr; //返回随机字符串则表示验证通过
                //return View();
            }
            else
            {
                return Content("failed:" + signature + "," + CheckSignature.GetSignature(timestamp, nonce, Token) + "。" +
                            "如果你在浏览器中看到这句话，说明此地址可以被作为微信公众账号后台的Url，请注意保持Token一致。");


                //如果用下面的方法通不过微信认证，在微信公共号中保存服务器“配置项”的“URL”、“Token”时，会一直提示Token验证失败。
                //ViewBag.meg="failed:" + signature + "," + CheckSignature.GetSignature(timestamp, nonce, Token) + "。" +
                //            "如果你在浏览器中看到这句话，说明此地址可以被作为微信公众账号后台的Url，请注意保持Token一致。";
                //return View();
            }
        }

        [HttpPost]
        public ActionResult Index(PostModel postModel)
        {

            if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
            {
                ViewBag.meg = "参数错误";
                return View();
            }
            else
            {
                postModel.Token = Token;
                postModel.EncodingAESKey = "GRdRmucSBa8Qi11DRjPY5wEy1erCKWe0hR7ybvSDKVD";//根据自己后台的设置保持一致
                postModel.AppId = "wxbb4e29f6c8de8b0c";//根据自己后台的设置保持一致
                //设置每个人上下文消息储存的最大数量，防止内存占用过多，如果该参数小于等于0，则不限制
                var maxRecordCount = 10;
                //自定义MessageHandler，对微信请求的详细判断操作都在这里面。
                var messageHandler = new CustomMessageHandler(Request.InputStream, maxRecordCount);
                try
                {
                    //测试时可开启此记录，帮助跟踪数据，使用前请确保App_Data文件夹存在，且有读写权限。
                    messageHandler.RequestDocument.Save(
                        Server.MapPath("~/App_Data/" + DateTime.Now.Ticks + "_Request_" +
                                       messageHandler.RequestMessage.FromUserName + ".txt"));
                    //执行微信处理过程
                    messageHandler.Execute();
                    //测试时可开启，帮助跟踪数据
                    messageHandler.ResponseDocument.Save(
                        Server.MapPath("~/App_Data/" + DateTime.Now.Ticks + "_Response_" +
                                       messageHandler.ResponseMessage.ToUserName + ".txt"));
                    return Content(messageHandler.ResponseDocument.ToString());
                }
                catch (Exception ex)
                {
                    //将程序运行中发生的错误记录到App_Data文件夹
                    using (TextWriter tw = new StreamWriter(Server.MapPath("~/App_Data/Error_" + DateTime.Now.Ticks + ".txt")))
                    {
                        tw.WriteLine(ex.Message);
                        tw.WriteLine(ex.InnerException.Message);
                        if (messageHandler.ResponseDocument != null)
                        {
                            tw.WriteLine(messageHandler.ResponseDocument.ToString());
                        }
                        tw.Flush();
                        tw.Close();
                    }
                    return Content("");
                }
                finally
                {
                    Response.End();
                }
            }
        }
    }
}